今天來稍微講一下爬蟲,你可能會問:爬蟲?跟AI有關係嗎?
下面就讓我們來介紹介紹
爬蟲(Web Scraping)
是一種自動化獲取網絡數據的技術,通過模擬瀏覽器的行為,從網站上提取所需的信息。爬蟲可以讀取網頁的HTML代碼,解析其結構,並提取出需要的數據,如文本、圖片、鏈接等。這些數據可以存儲、分析、可視化或用於其他用途。
為什麼要學爬蟲?
數據收集:網絡上包含了大量有用的數據,包括新聞、價格、評論、社交媒體信息等。學習爬蟲可以幫助您自動化數據收集過程,節省大量時間和精力。
自定義內容:通過爬蟲,您可以創建自己的數據集,用在模型訓練上,並且能夠控制所需數據的品質和種類。
但使用爬蟲也要注意一些問題,爬蟲雖然是獲取資料的好方法,但也因此有大量使用者會使用,而這也衍生出網站會有過量請求,進而造成網站負擔,因此在爬蟲普及後大量網站也開始會偵測爬蟲使用者並封鎖,為了避免這情形有使用者代理(user agent)、浮動IP、延遲請求時間等等方式。
總之學習爬蟲是一項有價值的技能,可以應用於各種領域,從數據分析到市場研究等,並能夠幫助有效地獲取和利用網絡上的訊息。
簡短介紹一下我們所使用的工具
Selenium
用於自動化瀏覽器操作的工具和框架,可以模擬人類對瀏覽器的交互行為,例如點擊按鈕、填寫表單、瀏覽網頁和提取網頁數據等。
BeautifulSoup
Beautiful Soup(簡稱BS4)是一個Python庫,用於解析HTML和XML文檔,提取其中的數據,並簡化網頁數據的擷取過程。
安裝函式庫
首先把爬蟲函式庫安裝好,一樣叫出我們的老朋友(土豆)CMD然後
pip install BeautifulSoup
pip install selenium
這樣就完成了,接下來就是程式部分
這段程式碼是一個用於爬取Google圖片搜索結果的爬蟲程式。
from bs4 import BeautifulSoup
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.chrome.service import Service
import time
import os
import shutil
import requests
這裡引入了BeautifulSoup用於解析HTML、Selenium用於自動化瀏覽器操作、以及其他必要的函式庫。
local_path = 'images/1' # 存圖位置可自己改
img_class = 'rg_i' # 目標元素的class
這裡定義了存儲圖片的本地路徑(local_path
)和要爬取的圖片元素的class名稱(img_class
)。
這裡可以直接使用抓取class為img的原因是我們是使用google圖片,若是在其他網站且兩旁有廣告可能就不能這麼做,因為他會把所有img標籤檔案下載,包含廣告圖片,因此若是要下載其他資料則要用其他方式(這裡不多做介紹)。
url = 'https://www.google.com/search?sca_esv=563286194&hl=zh-TW&sxsrf=AB5stBhULplilmDPtWzjSST6XL-DTIN1Mg:1694059984176&q=%E4%BA%BA%E5%83%8F&tbm=isch&source=lnms&sa=X&ved=2ahUKEwiA29ac0ZeBAxUPH3AKHWOyCHAQ0pQJegQICxAB&biw=1920&bih=923&dpr=1'
chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument("user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36")
在這裡指定了Google圖片搜索的URL(url
),並設定了user agent,以模擬正常的瀏覽器訪問。
url裡放的網址是依照所需放置,例子中所使用的是在GooGle搜尋"人像",所以你想找花生就改成放搜尋花生的網址。
service = Service()
options = webdriver.ChromeOptions()
chrome = webdriver.Chrome(service=service, options=options)
chrome.get(url)
這裡創建了Chrome WebDriver對象,並使用它前往指定的URL。
if not os.path.exists(local_path):
os.makedirs(local_path)
img_url_dic = {}
這段程式碼判別如果目錄不存在的話,創建存儲圖片的資料夾
scroll_pause_time = 1
last_height = chrome.execute_script("return document.body.scrollHeight")
在這裡,程序設定了滾動視窗的間歇時間,然後獲取了網頁當前的高度。
while True:
chrome.execute_script("window.scrollTo(0, document.body.scrollHeight);")
time.sleep(scroll_pause_time)
time.sleep(0.05)
new_height = chrome.execute_script("return document.body.scrollHeight")
try:
show_more_button = chrome.find_element("xpath", '//*[@id="islmp"]/div/div/div/div/div[1]/div[2]/div[2]/input')
show_more_button.click()
except Exception as e:
print("無法點擊顯示更多按鈕:", e)
if new_height == last_height:
break
last_height = new_height
這段程式碼模擬滾動視窗以加載更多圖片,同時嘗試找到並點擊"顯示更多"按鈕來加載更多圖片。這樣可以繼續滾動視窗,直到無法再加載更多圖片為止。
try那行標記了按鈕位置
當然可以模仿其他動作,例如右鍵、Enter等等,甚至可以我們把要尋找圖片名稱設好,全讓爬蟲自己搜尋,不需要我們幫他找好網址。
soup = BeautifulSoup(chrome.page_source, 'html.parser')
這
裡使用BeautifulSoup解析網頁內容,以便後續提取圖片的URL。
m = 1 # 起始圖片編號
for img in soup.find_all('img', class_=img_class):
try:
img_url = img.get('src')
# 保存圖片到指定路徑
if img_url and not img_url in img_url_dic:
img_url_dic[img_url] = ''
m += 1
ext = os.path.splitext(img_url)[1]
filename = str(m) + ext +'.png'
print(filename)
# 下載圖片
img_response = requests.get(img_url, stream=True)
with open(os.path.join(local_path, filename), 'wb') as out_file:
shutil.copyfileobj(img_response.raw, out_file)
del img_response
except Exception as e:
print('發生錯誤:', e)
這段程式碼遍歷網頁中的圖片元素,提取圖片的URL,然後下載圖片並保存到本地目錄中。
chrome.quit()
print('下載完成')
最後,關閉瀏覽器,完成爬取任務。
以上程式碼就是如何使用Selenium和BeautifulSoup來自動化爬取Google圖片搜索結果中的圖片並保存到本地資料夾。
這裡可以練習下載兩種圖片,存檔位置可以分別為images/1 與 images/2 ,後續我們來用自己爬蟲的資料來做訓練,今天就先到這邊~我們明天見~~